/**
 * @author ChaP
 * @date 2019/06/10
 * @describe:
 */
package CodingTest.AC20190610;

/**leetcode - 477
 * 两个整数的 汉明距离 指的是这两个数字的二进制数对应位不同的数量。

 计算一个数组中，任意两个数之间汉明距离的总和。

 示例:

 输入: 4, 14, 2

 输出: 6

 解释: 在二进制表示中，4表示为0100，14表示为1110，2表示为0010。（这样表示是为了体现后四位之间关系）
 所以答案为：
 HammingDistance(4, 14) + HammingDistance(4, 2) + HammingDistance(14, 2) = 2 + 2 + 2 = 6.
 */

//垂直思考，计算每个nums数中每一位是否为1，则汉明码为1的个数*0的个数
public class totalHammingDistance {
    public int totalHammingDistance(int[] nums){
        int res = 0;
        for(int i =0;i<32;i++){
            int count = 0;
            for(int j = 0;j<nums.length;j++){
                if((nums[j]&1) == 1){
                    count++;
                }
                nums[j]=nums[j]>>1; // 当前数右移一位
            }
            res += count*(nums.length-count); // 1的个数*0的个数
        }
        return res;

    }

    public static void main(String[] args) {
        int[] nums = {4,14,2};
        totalHammingDistance th = new totalHammingDistance();
        System.out.println(th.totalHammingDistance(nums));
    }
}
